#include "playsence.h"
#include<QMenuBar>
#include<QPainter>
#include<mypushbutton.h>
#include<QTimer>
#include<QLabel>
#include"mycoin.h"
#include"dataconfig.h"
#include<QDebug>
#include<QPropertyAnimation>
#include<QSound>
//playSence::playSence(QWidget *parent) :
//    QMainWindow(parent)
//{
//}
playSence::playSence(int levelNum)
{
    this->levleIndex=levelNum;

    this->setFixedSize(430,655);
     //设置图标
     this->setWindowIcon(QIcon(":/res/Coin0001.png"));
     //设置标题
     this->setWindowTitle("游戏关卡场景");
     //设置菜单栏
     QMenuBar *bar=menuBar();
     this->setMenuBar(bar);
     //设置菜单项
     QMenu *startMenu=bar->addMenu("开始");
     QAction *quitAction=startMenu->addAction("退出");
     //点击退出，实现退出游戏
     connect(quitAction,&QAction::triggered,[=](){
         this->close();
     });

     //设置返回按钮
     MyPushButton *backBtn=new MyPushButton(":/res/BackButton.png",":/res/BackButtonSelected.png");
     backBtn->setParent(this);
     backBtn->move(this->width()-backBtn->width(),this->height()-backBtn->height());
     //设置返回按钮的点击音效
     QSound *backM=new QSound(":/res/BackButtonSound.wav",this);
     //点击 延时0.5s返回  版本过低 无法使用QTimer::signalShot()
     QTimer *timer=new QTimer(this);
     connect(timer,&QTimer::timeout,[=](){

         emit this->chooseSenceBack(); //触发自定义信号
         timer->stop();
     });
     connect(backBtn,&QPushButton::clicked,[=](){
         //触发返回按钮音效
         backM->play();
        timer->start(500);
     });

     //显示当前关卡数
     QLabel *label=new QLabel;
     label->setParent(this);
     //设置关卡号的字体
     QFont font;
     font.setFamily("宋体");
     font.setPointSize(15);
     label->setFont(font);
     QString str=QString("Level:%1").arg(this->levleIndex);
     label->setText(str);
     label->setGeometry(QRect(30,this->height()-50,150,50));

     //设置胜利图片，等待砸下来~
     QLabel *winLabel=new QLabel;
     winLabel->setParent(this);
     QPixmap tempix;
     tempix.load(":/res/LevelCompletedDialogBg.png");
     winLabel->setGeometry(0,0,tempix.width(),tempix.height());
     winLabel->setPixmap(tempix);
     winLabel->move((this->width()-tempix.width())*0.5,-tempix.height());
     //初始化每个关卡的二维数组
     dataConfig config;
     for(int i=0;i<4;i++)
     {
          for(int j=0;j<4;j++)
          {
              this->gameArray[i][j]=config.mData[levelNum][i][j];
          }
     }

     //设置翻金币的音效
     QSound *coinM=new QSound(":/res/ConFlipSound.wav",this);
     //设置胜利的音效
     QSound *winM=new QSound(":/res/LevelWinSound.wav",this);
     for(int i=0;i<4;i++)
     {
         for(int j=0;j<4;j++)
         {
             //绘制金币背景图案
             QLabel *label=new QLabel;
             label->setParent(this);
             label->setGeometry(0,0,60,60);
//             QPixmap  pix;
//             pix.load(":/res/BoardNode(1).png");
//             label->setPixmap(pix);
             label->setPixmap(QPixmap(":/res/BoardNode(1).png"));
             label->setScaledContents(true); //图片自适应大小
             label->move(100+i*60,220+j*60);

             //显示金币或银币
             QString str;
             if(this->gameArray[i][j]==1)
             {
                 str=":/res/Coin0001.png";
             }
             else
             {
                 str=":/res/Coin0008.png";
             }
             myCoin *cbtn=new myCoin(str);
             cbtn->setParent(this);
             cbtn->move(100+i*60,220+j*60);
             cbtn->posX=i;
             cbtn->posY=j;
             cbtn->flag=this->gameArray[i][j];
             //将金币放到二维数组里，以便维护
             coinBtn[i][j]=cbtn;
             //点击金币，进行翻转
             connect(cbtn,&QPushButton::clicked,[=](){
                 //触发翻金币音效
                 coinM->play();
//////如果手速够快，在点击能胜利的金币时点击其他金币，会出现胜利标志出现，但游戏中出现银币的情况，为了解决这个bug，在每次翻金币后，都把所有按钮标志置为true，
//////并在翻转了周围金币后，将所有标志再还原回来置为false
               //将所有金币标志置为true,禁掉点击效果
                 for(int i=0;i<4;i++)
                 {
                     for(int j=0;j<4;j++)
                     {
                         coinBtn[i][j]->winFlag=true;
                     }
                 }
                 cbtn->changeFlag();
                 this->gameArray[i][j]=this->gameArray[i][j]==0?1:0;
                 //翻转周围金币  延时翻转
                 //周围的右侧金币翻转条件
                 QTimer *timer3=new QTimer(this);
                 timer3->start(300);
                 connect(timer3,&QTimer::timeout,[=](){
                     if(cbtn->posY+1<=3)
                     {
                        coinBtn[cbtn->posX][cbtn->posY+1]->changeFlag();
                        this->gameArray[cbtn->posX][cbtn->posY+1]=this->gameArray[cbtn->posX][cbtn->posY+1]==0?1:0;
                     }
                     //周围的左侧金币翻转条件
                     if(cbtn->posY-1>=0)
                     {
                        coinBtn[cbtn->posX][cbtn->posY-1]->changeFlag();
                        this->gameArray[cbtn->posX][cbtn->posY-1]=this->gameArray[cbtn->posX][cbtn->posY-1]==0?1:0;
                     }
                     //周围的上侧金币翻转条件
                     if(cbtn->posX-1>=0)
                     {
                        coinBtn[cbtn->posX-1][cbtn->posY]->changeFlag();
                        this->gameArray[cbtn->posX-1][cbtn->posY]=this->gameArray[cbtn->posX-1][cbtn->posY]==0?1:0;
                     }
                     //周围的下侧金币翻转条件
                     if(cbtn->posX+1<=3)
                     {
                        coinBtn[cbtn->posX+1][cbtn->posY]->changeFlag();
                        this->gameArray[cbtn->posX+1][cbtn->posY]=this->gameArray[cbtn->posX+1][cbtn->posY]==0?1:0;
                     }
                     timer3->stop();
                     //将标志还原回false
                     for(int i=0;i<4;i++)
                     {
                         for(int j=0;j<4;j++)
                         {
                             coinBtn[i][j]->winFlag=false;
                         }
                     }
                     //判断是否胜利
                     this->isWin=true;
                     for(int i=0;i<4;i++)
                     {
                         for(int j=0;j<4;j++)
                         {
                             if(coinBtn[i][j]->flag==false)
                             {
                                 this->isWin=false;
                                 break;
                             }
                         }
                     }
                     if(this->isWin==true)
                     {
                          qDebug()<<"游戏胜利！";
                          for(int i=0;i<4;i++)
                          {
                              for(int j=0;j<4;j++)
                              {
                                  coinBtn[i][j]->winFlag=true;
                              }
                          }
                          //播放胜利音效
                          winM->play();
//////////////////////winM->setLoops(-1);//该方法能够设置音效播放次数，-1代表无限循环/////////////////////////

                          //将胜利图片砸下来
                          QPropertyAnimation *animation=new QPropertyAnimation(winLabel,"geometry");
                          //设置时间间隔
                          animation->setDuration(1000);
                          animation->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
                          animation->setEndValue(QRect(winLabel->x(),winLabel->y()+114,winLabel->width(),winLabel->height()));
                          //设置缓和曲线
                          animation->setEasingCurve(QEasingCurve::OutBounce);
                          //执行动画
                          animation->start();
                     }
                 });

             });



         }
     }


}
void playSence::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap  pix;
    pix.load(":/res/PlayLevelSceneBg.png");
    painter.drawPixmap(0,0,this->width(),this->height(),pix);//this->width(),this->height()消除图片拉伸

    //画背景图标
    pix.load(":/res/Title.png");
    pix=pix.scaled(pix.width()*0.5,pix.height()*0.5);//设置pix图像大小
    painter.drawPixmap(10,30,pix);

}
